package com.zhang.utils;

import com.zhang.entity.Menu;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

/**
 * @program: xinguan-parent
 * @description: 多级菜单递归遍历封装类
 * @author: Mr.Zhang
 * @create: 2022-03-02 22:16
 **/
public class MenuTreeBuild {

    public static List<Menu> build(List<Menu> rootMenu) {
        // 最后的结果
        List<Menu> menuList = new ArrayList<>();
        // 在所有菜单项中，先找到所有的一级菜单
        for (Menu menu : rootMenu) {
            //找到一级菜单项
            if (menu.getParentId() == 0) {
                menuList.add(menu);
            }
        }
        Collections.sort(menuList);
        // 在所有菜单项中，找到一级菜单的子菜单
        for (Menu menu : menuList) {
            menu.setChildMenu(getChildMenu(menu.getId(), rootMenu));
        }
        return menuList;
    }

    /**
     * 功能描述: <br>
     * 〈根据父级菜单Id查询子级菜单并获得子级的子级菜单〉
     * 自己调用自己
     *
     * @Param: [parentId 父级菜单项ID, rootMenu 所有菜单集合]
     * @Return: java.util.List<com.zhang.entity.Menu>
     * @Author: Mr.zhang
     * @Date: 2022/3/2 22:55
     */
    public static List<Menu> getChildMenu(Long parentId, List<Menu> rootMenu) {
        List<Menu> chileMenu = new ArrayList<>();
        for (Menu menu : rootMenu) {
            //找到父级菜单id为 parentId 的菜单项
            if (menu.getParentId().longValue() == parentId.longValue()) {
                chileMenu.add(menu);
            }
        }
        //排序
        Collections.sort(chileMenu);

        //遍历二级菜单查找子项
        for (Menu menu : chileMenu) {
            //找到父级菜单id为 parentId 的菜单项
            menu.setChildMenu(getChildMenu(menu.getId(), rootMenu));
        }
        //递归退出条件，当查找子菜单数量为0时退出
        if (chileMenu.size() == 0) {
            return null;
        }
        return chileMenu;
    }

}
